package com.sjz.myfrist;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.List;

/***
 adapter重写了父类的构造函数，用于将上下文，ListView子项布局的id和数据传递进来。
 重写getView()方法，此方法在每个子项被滚动到屏幕内时调用。
 在getView()方法中，首先通过getItem方法得到当前项的image实例，然后使用LayoutInflater方法来为这个子项加载传入的布局，
 LayoutInflater方法的inflate方法接收3个参数，第三个参数指定为false，表示只让在父布局中声明的layout属性生效，接下来获取到两个实例，
 并分别调用setImageResource和setText方法设置显示的图片和文字，最后将布局返回，这样自定义的适配器就完成了。

 */
public class Adapter extends ArrayAdapter<Image> {
    private int resourceId;

    public Adapter(Context context, int textViewResourceId, List<Image> objects){
        super(context,textViewResourceId,objects);
        resourceId = textViewResourceId;
    }

    /***
     * 存在的问题
     * adapter的getView()方法中，每次都将布局重新加载一遍，当ListView快速滚动的时候，运行效率会降低。
     * 再比如：每次在getView()方法中都会调用findViewById()方法获取控件实例。
     * @param position
     * @param convertView
     * @param parent
     * @return
     */

    /***
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        //获取当前位置的数据
        Image image = getItem(position);
        View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
        ImageView image2 = view.findViewById(R.id.listview2_image);
        TextView name = view.findViewById(R.id.listview2_name);
        image2.setImageResource(image.getImageId());
        name.setText(image.getName());
        return view;
    }
     ***/


    /****
     *   getView()方法有一个convertView参数，这个参数用于将之前加载好的布局进行缓存，如果为null则加载布局，如果不为null则直接重用convertView。
     *   这样优化了第一个问题。
     *  新增一个内部类ViewHolder，用于对控件的实例进行缓存，当convertView为null时，创建一个ViewHolder对象，将控件的实例都存放在ViewHolder里，
     *  调用setTag()方法，将ViewHolder对象存放在View中；不为null时，调用getTag，重新取出。这样优化了第二个问题。
     *
     * @param position
     * @param convertView
     * @param parent
     * @return
     */
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Image image = getItem(position);
        View view;
        ViewHolder viewHolder;
        if(convertView == null){
            view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
            viewHolder = new ViewHolder();
            viewHolder.image = view.findViewById(R.id.listview2_image);
            viewHolder.name = view.findViewById(R.id.listview2_name);
            view.setTag(viewHolder);//调用setTag()方法，将ViewHolder对象存放在View中

        }else{
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.image.setImageResource(image.getImageId());
        viewHolder.name.setText(image.getName());
        return view;
    }
    class ViewHolder{
        ImageView image;
        TextView name;
    }
}